package com.hll.mail;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.security.GeneralSecurityException;
import java.util.Properties;

/**
 * @author: Mr.Hu
 * @create: 2021-03-09 10:23
 */
public class sendMailWithFile {
  private static String mail = "2621365348@qq.com";
  private static String code = "hztnbbtkaoyfecic"; // qq邮箱网页端-设置-账户-开启pop3

  public static void main(String[] args) throws MessagingException, GeneralSecurityException {
    Properties prop = new Properties();
    prop.setProperty("mail.host", "smtp.qq.com"); // 设置QQ邮件服务器
    prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
    prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码

    // 关于QQ邮箱，还要设置SSL加密，加上以下代码即可
    MailSSLSocketFactory sf = new MailSSLSocketFactory();
    sf.setTrustAllHosts(true);
    prop.put("mail.smtp.ssl.enable", "true");
    prop.put("mail.smtp.ssl.socketFactory", sf);

    // 使用JavaMail发送邮件的5个步骤

    // 1、创建定义整个应用程序所需的环境信息的 Session 对象
    // 使用QQ邮箱的时候才需要，其他邮箱不需要这一段代码
    Session session =
        Session.getDefaultInstance(
            prop,
            new Authenticator() { // 获取和SMTP服务器的连接对象
              public PasswordAuthentication getPasswordAuthentication() {
                // 发件人邮件用户名、授权码
                return new PasswordAuthentication(mail, code);
              }
            });

    // 开启Session的debug模式，这样就可以查看到程序发送Email的运行状态
    session.setDebug(true);

    // 2、通过session得到transport对象
    Transport ts = session.getTransport(); // 通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象

    // 3、使用邮箱的用户名和授权码连上SMTP邮件服务器，即登陆
    ts.connect("smtp.qq.com", mail, code);

    // 4、创建邮件对象MimeMessage——点击网页上的写信
    // 创建一个邮件对象
    MimeMessage message = new MimeMessage(session);
    // 指明邮件的发件人——在网页上填写发件人
    message.setFrom(new InternetAddress(mail)); // 设置发件人
    // 指明邮件的收件人，现在发件人和收件人是一样的，那就是自己给自己发——在网页上填写收件人
    message.setRecipient(Message.RecipientType.TO, new InternetAddress(mail)); // 设置收件人
    // 邮件的标题——在网页上填写邮件标题
    message.setSubject("简单邮件发送实现"); // 设置邮件主题

    System.out.println(
        "=============================复杂邮件的邮件内容设置==================================");

    /*
    编写邮件内容
    1.图片
    2.附件
    3.文本
     */

    // 图片
    MimeBodyPart body1 = new MimeBodyPart();
    body1.setDataHandler(
        new DataHandler(
            new FileDataSource("D:\\ChangZhi\\IDEAProjects\\JavaWebDemo-01\\notePic\\mvc2.png")));
    body1.setContentID("yhbxb.png"); // 图片设置ID

    // 文本
    MimeBodyPart body2 = new MimeBodyPart();
    body2.setContent("请注意，我不是广告<img src='cid:yhbxb.png'>", "text/html;charset=utf-8");

    String file1 = "D:\\ChangZhi\\IDEAProjects\\JavaWebDemo-01\\notePic\\mvc1.png";
    String file2 = "D:\\ChangZhi\\IDEAProjects\\JavaWebDemo-01\\notePic\\mvc1.png";
    // 附件
    MimeBodyPart body3 = new MimeBodyPart();
    body3.setDataHandler(new DataHandler(new FileDataSource(file1)));
    body3.setFileName(file1.substring(file1.lastIndexOf("\\") + 1)); // 附件设置名字

    MimeBodyPart body4 = new MimeBodyPart();
    body4.setDataHandler(new DataHandler(new FileDataSource(file2)));
    body4.setFileName(file2.substring(file2.lastIndexOf("\\") + 1)); // 附件设置名字

    // 拼装邮件正文内容
    MimeMultipart multipart1 = new MimeMultipart();
    multipart1.addBodyPart(body1);
    multipart1.addBodyPart(body2);
    multipart1.setSubType("related"); // 1.文本和图片内嵌成功！

    // new MimeBodyPart().setContent(multipart1); //将拼装好的正文内容设置为主体
    MimeBodyPart contentText = new MimeBodyPart();
    contentText.setContent(multipart1);

    // 拼接附件
    MimeMultipart allFile = new MimeMultipart();
    allFile.addBodyPart(body3); // 附件
    allFile.addBodyPart(body4); // 附件
    allFile.addBodyPart(contentText); // 正文
    allFile.setSubType("mixed"); // 正文和附件都存在邮件中，所有类型设置为mixed；

    // 设置到消息中，保存修改
    message.setContent(allFile); // 将MimeMultipart放入消息对象中
    message.saveChanges(); // 保存上面的修改

    System.out.println("===============================================================");

    // 5、发送邮件——在网页上点击发送按钮
    ts.sendMessage(message, message.getAllRecipients());

    // 6、关闭连接对象，即关闭服务器上的连接资源
    ts.close();
  }
}
